﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Collections.Generic;
using System.Linq;
using Biciq.Web.UI.Servicios;
using System.ServiceModel.DomainServices.Client;
using System.IO;
using System.Windows.Media.Imaging;
using System.Windows.Browser;
using Biciq.Silverlight.UI.Clases;

namespace Biciq.Silverlight.UI
{
    public class EditarEmpleadoVistaModelo:VistaModeloBase
    {
        
        #region campos
        private string _foto;
        private BitmapImage _imagen;
        private Visibility _mostrarAbrir;

        private Empleado _EmpleadoActual;
        private bool _modoEditar;
        private RelayCommand _comandoGuardar;
        private Recurso _selectedItem;
       
        private String _titulo;
        private Rol _rolSeleccionado;
        private List<Rol> _listaRoles;

        private bool _editarDatos;

        private string _tipoTarjeta;



        private string _status;

        #endregion

        #region comandos


        private RelayCommand _comandoAgregarFoto;
        /// <summary>
        /// Comando que agrega fotografia al empleado.
        /// </summary>
        public RelayCommand ComandoAgregarFoto
        {
            get
            {
                if (_comandoAgregarFoto == null)
                {
                    _comandoAgregarFoto = new RelayCommand
                    (
                        p => AgregarFoto()
                    );
                }
                return _comandoAgregarFoto;
            }
        }
       
        #endregion

        #region propiedades

        public string TipoTarjeta
        {
            get { return _tipoTarjeta; }
            set 
            { 
                _tipoTarjeta = value;
                RaisePropertyChanged("TipoTarjeta");
            }
        }
        /// <summary>
        /// Comando para editar datos del Empleado.
        /// </summary>
        public bool EditarDatos
        {
            get { return _editarDatos; }
            set
            {
                _editarDatos = value;
                RaisePropertyChanged("EditarDatos");
            }
        }

        public string Status
        {
            get { return _status; }
            set
            {
                _status = value;
                RaisePropertyChanged("Status");

            }
        }
        /// <summary>
        /// Comando para abrir imagen.
        /// </summary>
        public Visibility MostrarAbrir
        {
            get { return _mostrarAbrir; }
            set
            {
                _mostrarAbrir = value;
                RaisePropertyChanged("MostrarAbrir");
            }
        }
        public BitmapImage Imagen
        {
            get { return _imagen; }
            set
            {
                _imagen = value;
                RaisePropertyChanged("Imagen");
            }
        }
        public string Foto
        {
            get { return _foto; }
            set
            {
                _foto = value;
                RaisePropertyChanged("Foto");
            }
        }
        

          /// <summary>
        /// Propiedad para la lista de recursos
        /// </summary>
        public List<Rol> ListaRoles
        {
            get { return _listaRoles; }
            set
            {
                _listaRoles = value;
                RaisePropertyChanged("ListaRoles");
            }
        }

        /// <summary>
        /// Para recuperar el recurso seleccionado
        /// </summary>
        public Rol RolSeleccionado
        {
            get { return _rolSeleccionado; }
            set 
            {
                _rolSeleccionado = value;
                RaisePropertyChanged("RolSeleccionado");
            }
        }


        /// <summary>
        /// Titulo de la pantalla
        /// </summary>
        public String Titulo
        {
            get { return _titulo; }
            set
            {
                _titulo = value;
                RaisePropertyChanged("Titulo");
            }
        }




        /// <summary>
        /// Empleado actual para editar o crear uno nuevo
        /// </summary>
        public Empleado EmpleadoActual
        {
            get { return _EmpleadoActual; }
            set
            {
                _EmpleadoActual = value;
                _EmpleadoActual.PropertyChanged += (ob, ev) =>
                {
                    //Indica si hubo cambios en el EmpleadoActual
                    IsDirty = true;
                    RaisePropertyChanged("EmpleadoActual." + ev.PropertyName);
                };
                RaisePropertyChanged("EmpleadoActual");
            }
        }

        /// <summary>
        /// Propiedad que nos indica si un Empleado se va a editar
        /// </summary>
        public bool ModoEditar
        {
            get { return _modoEditar; }
            set
            {
                _modoEditar = value;
            }
        }


        #endregion

        #region constructores
        public EditarEmpleadoVistaModelo(Empleado Empleado)
        {
            Procesando = true;
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo ="Editar Empleado";
            BiciqContexto.Empleados.Clear();
            var Empleados = BiciqContexto.Empleados;
            

                BiciqContexto.Load(BiciqContexto.GetRolsQuery()).Completed += delegate
                {
                    ListaRoles = BiciqContexto.Rols.ToList();
                  

                    BiciqContexto.Load(BiciqContexto.GetEmpleadoIdQuery(Empleado.id)).Completed += delegate
                    {
                        EmpleadoActual = Empleados.FirstOrDefault();
                        RolSeleccionado = EmpleadoActual.Usuario.Rol;
                          IsDirty = false;
                            Procesando = false;

                            MostrarAbrir = Visibility.Collapsed;
                            Uri uriImage = new Uri(EmpleadoActual.foto);

                            Imagen = new BitmapImage(uriImage); 

                    };
                };

            

            _modoEditar = true;
            EditarDatos = false;
         
        }

        public EditarEmpleadoVistaModelo()
        {
            Procesando = true;
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo = "Crear Empleado";

            _modoEditar = false;
            EmpleadoActual = new Empleado();
            EmpleadoActual.Usuario = new Usuario();
            EmpleadoActual.Usuario.id = Guid.NewGuid();
            EmpleadoActual.Usuario.estado = "ACT";
            EmpleadoActual.Usuario.primerIngreso = true;
            
            EmpleadoActual.estado = RecursosLenguaje.Recursos.Activo;
            EmpleadoActual.id = Guid.NewGuid();
            IsDirty = false;

              BiciqContexto.Load(BiciqContexto.GetRolsQuery()).Completed += delegate
                {
                    ListaRoles = BiciqContexto.Rols.ToList();
                    Procesando = false;
                };
              EditarDatos = true;
              MostrarAbrir = Visibility.Visible;
        }
        #endregion

        #region metodos privados
        /// <summary>
        /// Metodo para agregar una Fotografia.
        /// </summary>
        private void AgregarFoto()
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Multiselect = false;
            dlg.Filter = "Png (*.png)|*.png|Jpg (*.jpg)|*.jpg|Gif (*.gif)|*.gif";

            bool? retval = dlg.ShowDialog();

            if (retval != null && retval == true)
            {
                FileInfo fi = dlg.File;
                if (fi != null)
                {
                    using (Stream stream = fi.OpenRead())
                    {

                        Imagen = new BitmapImage();
                        Imagen.SetSource(stream);

                    }

                }
                UploadFile(EmpleadoActual.id.ToString() + dlg.File.Extension, dlg.File.OpenRead());
                Status = dlg.File.Extension;
            }
            else
            {
                Status = "No file selected...";
            }
        }
        private void UploadFile(string fileName, Stream data)
        {

            var urlFotos = ConfigurationManager.AppSettings["WebSite"].ToString() + "Controladores/receiver.ashx";
           
                           

            UriBuilder ub = new UriBuilder(urlFotos);
            ub.Query = string.Format("filename={0}", fileName);
            WebClient c = new WebClient();
            c.OpenWriteCompleted += (sender, e) =>
            {
                PushData(data, e.Result);
                e.Result.Close();
                data.Close();

                Foto =  ConfigurationManager.AppSettings["WebSite"].ToString() +"Fotografias/" + EmpleadoActual.id.ToString() + Status;
            };
            c.OpenWriteAsync(ub.Uri);
        }
        
        private void PushData(Stream input, Stream output)
        {
            byte[] buffer = new byte[4096];
            int bytesRead;

            while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0)
            {
                output.Write(buffer, 0, bytesRead);
            }
        }

        public void validarTarjeta()
        {
            Procesando = true;
            if (EmpleadoActual.Codigo != null && EmpleadoActual.Codigo != "")
            {
                BiciqContexto.Tarjetas.Clear();
                BiciqContexto. Load( BiciqContexto.GetTarjetaPorCodigoQuery(EmpleadoActual.Codigo)).Completed += delegate
                    {

                        Procesando = false;
                        var tarjeta = BiciqContexto.Tarjetas.FirstOrDefault();
                        if (tarjeta != null)
                        {

                            if (EmpleadoActual.Tarjeta != null)
                            {
                                EmpleadoActual.Tarjeta.Estado = "ELIMINADO";
                            }

                            EmpleadoActual.IdTarjeta = tarjeta.id;
                            tarjeta.Estado = "ASIGNADO";
                            EmpleadoActual.fechaAsignacion = DateTime.Now;

                        }
                        else
                        {
                            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El código ingresado no está ingresado en el Sistema o está asignado a otra persona, confirme con el administrador del Sistema", "Error Código Tarjeta", LogicStudio.Framework.UI.Utilidades.TipoVentana.Error);
                            EmpleadoActual.Codigo = "";
                        }
                        
                    };
            }

        }
        /// <summary>
        /// Método en el cual se guarda el Empleado
        /// </summary>
        public override void  Guardar()

        {
            if (!ModoEditar)
            {
                EmpleadoActual.Usuario.clave = EmpleadoActual.Usuario.nombreUsuario;
                EmpleadoActual.Usuario.idRol = RolSeleccionado.id;
                EmpleadoActual.foto = Foto;
            }
            InicializarMensajesError();

            if (RolSeleccionado == null)
            {
                AgregarMensajeError("Debe seleccionar un Rol para el empleado");
                return;
            }


            if (TipoTarjeta  == null  || TipoTarjeta=="")
            {
                AgregarMensajeError("Debe seleccionar un Tipo de Tarjeta para el empleado");
                return;
            }
            if (ValidarEntidadConMetadata(EmpleadoActual).Count>0)
            {
                return ;
            }

              if (ValidarEntidadConMetadata(EmpleadoActual.Usuario).Count>0)
            {
                return ;
            }

            BiciqDomainContext BiciqContextoaUX = new BiciqDomainContext();

            var Empleados = BiciqContextoaUX.Empleados.ToList();
            string titulo = string.Format(RecursosLenguaje.Recursos.Empleado.ToString());
            BiciqContextoaUX.Empleados.Clear();
            EmpleadoActual.nombresApellidos = EmpleadoActual.nombres  + " "  +  EmpleadoActual.apellidos;

             BiciqContextoaUX.Usuarios.Clear();
             BiciqContextoaUX.Load(BiciqContextoaUX.GetUsuarioNombreQuery(EmpleadoActual.Usuario.nombreUsuario)).Completed += delegate
             {
                var  Usuarios = BiciqContextoaUX.Usuarios.ToList();
                if (Usuarios.FirstOrDefault() != null && Usuarios.FirstOrDefault().id != EmpleadoActual.Usuario.id)
                 {
                     AgregarMensajeError("Existe un Empleado registrado con el mismo Usuario de Sistema");

                     MostrarErrores = Visibility.Visible;
                 }
                 else
                 {

                     MostrarErrores = Visibility.Collapsed;
                     if (this.IsDirty)
                     {
                         if (!this.ModoEditar)
                         {
                             EmpleadoActual.id = Guid.NewGuid();
                             BiciqContexto.Empleados.Add(EmpleadoActual);
                         }

                         BiciqContexto.SubmitChanges().Completed += delegate
                         {

                             if (!this.ModoEditar)
                             {
                                 LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeRegistroExitoso, titulo), titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                             }
                             else
                             {
                                 LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeActualizacionRegistro, titulo), titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                             }

                             var urlReporte = ConfigurationManager.AppSettings["WebSite"].ToString() + ConfigurationManager.AppSettings["CarpetaReportes"].ToString();
                             string tipoReporte = "";
                             switch (TipoTarjeta)
                             {
                                  case "Coordinación":
                                     tipoReporte = "Coordinacion";
                                break;
                                case "Gerencia":
                                     tipoReporte = "Gerencia";
                                break;
                                case "Operador de Apoyo":
                                     tipoReporte = "OperadorApoyo";
                                break;

                                case "Operador de Balance":
                                     tipoReporte = "OperadorBalance";
                                break;
                                case "Operador de Estación":
                                tipoReporte = "OperadorEstacion";
                                break;
                                case "Operador de Mecánica":
                                     tipoReporte = "OperadorMecanica";
                                break;
                             }
                             HtmlPage.Window.Navigate(new System.Uri(urlReporte + "?Reporte="+tipoReporte+"&Id=" + EmpleadoActual.id), "_blank");
                             CerrarVentana();
                         };

                     }
                     else
                     {
                         CerrarVentana();
                     }
                 }

             };
           
        }


        public override void Cancelar()
        {
            base.Cancelar(BiciqContexto);
        }
        #endregion

        #region metodos publicos

        #endregion
    
    }
}
